package com.java.collection.list;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;

import org.junit.Test;

import com.collection.model.Student;

/**
 * 1、List集合的特点
 * 		1、元素有序：插入和取出的顺序相同
 * 		2、此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引（在列表中的位置）访问元素，并搜索列表中的元素。
 *		3、与 set 不同，列表通常允许重复的元素。
 *		4、List 接口在 iterator、add、remove、equals 和 hashCode 方法的协定上加了一些其他约定，超过了 Collection 接口中指定的约定。
 *		5、List 接口提供了特殊的迭代器，称为 ListIterator，除了允许 Iterator 接口提供的正常操作外，该迭代器还允许元素插入和替换，以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。
 * 2、List集合特有的方法
 * 		1、void add(int index, Object element) : 在指定索引处添加元素
 * 		2、Object get(int index)：获取指定位置的元素
 * 		3、ListIterator listIterator()：List集合特有迭代器
 * 		说明：
 * 			1、该迭代器继承了Iterator迭代器接口，可以直接使用hasNext()和next()方法迭代集合元素
 * 			2、特有功能
 * 				（1）Object previous() : 获取前一个元素 ；
 * 				（2）boolean hasPrevious : 判断是否有前一个元素
 * 			3、注意：ListIterator可以实现逆向遍历，但是必须先正向遍历，才能逆向遍历，所以一般无意义，不使用。
 * 		4、Object remove(int index)：根据索引位置删除元素，返回被删除的元素
 * 		5、Object set(int index, Object element)：根据索引修改元素，返回被修改的元素
 *  3、List集合三个实现类的特点
 *  	1、ArrayList（重点）:
 *  		底层数据结构是数组，查询快，增删慢；
 *  		线程不安全，但效率高；
 *  	2、Vector向量：
 *  		Vector类可以实现可增长的对象数组。与数组一样，它包含可以使用整数索引进行访问的组件。但是，Vector 的大小可以根据需要增大或缩小，以适应创建 Vector 后进行添加或移除项的操作。 
 *  		底层数据结构是数组，查询快，增删慢
 *  		线程安全，效率低
 *  		说明：Vector向量特有方法
 *  			（1）void add addElement(Object obj)  --add()
 *  			（2）Object elementAt(int index)  --get()
 *  			（4）Emuneration elements()	--Iterator iterator()
 *  					boolean hasMoreElements()  --hasNext()
 *  					Object nextElement()  --next()
 *  					
 *  	3、LinkedList:
 *  		底层数据结构是链表，查询慢，增删快
 *  		线程不安全，效率高
 *  		说明：特有方法
 *  			void addFirst(E e)
 *  			void addLast(E e)
 *				E getFirst()
 *				E getLast()
 *				E removeFirst()
 *				E removeLast()
 * 4、补充：
 * 		1、将数组转换成list集合
 * 			利用Arrays工具类的asList()方法
 * @author LC
 *
 */
public class ListHandle {
	
	/**
	 * 测试List集合基本操作01
	 * 		List<String> list = new ArrayList<>() ;
	 */
	@Test
	public void testListHandle_01(){
		
		List<String> list = new ArrayList<>() ;
		
		list.add(0, "北京市-昌平区") ;
		list.add(1, "北京市-海淀区") ;
		list.add(2, "北京市-宣武区") ;
		list.add(3, "北京市-大兴区") ;
		
		System.out.println("获取list集合中索引位置为1的元素:" + list.get(1));
		System.out.println();
		
		System.out.println("循环输出list集合中的所有元素");
		for (int i = 0; i < list.size(); i++) {
			String element = list.get(i) ;
			System.out.println(element);
		}
		System.out.println();
		
		System.out.println("修改索引位置为1的元素：" + list.set(1, "北京市-海淀区-被修改了"));
		System.out.println();
		
		System.out.println("删除索引位置为2的元素");
		list.remove(2) ;
		System.out.println();
		
		System.out.println("迭代输出list集合中的所有元素");
		ListIterator<String> listIterator = list.listIterator() ;
		while(listIterator.hasNext()) {
			String element = listIterator.next() ;
			System.out.println(element);
		}
	}
	
	/**
	 * 测试List集合基本操作02
	 * 		List<Student> list = new ArrayList<>() ;
	 */
	@Test
	public void testListHandle_02() {
		
		List<Student> list = new ArrayList<>() ;
		
		Student stu01 = new Student("张三01",21) ;
		Student stu02 = new Student("张三02",22) ;
		Student stu03 = new Student("张三03",23) ;
		Student stu04 = new Student("张三04",24) ;
		
		list.add(0, null) ;
		list.add(1, stu03) ;
		list.add(2, stu02) ;
		list.add(3, stu01) ;
		list.add(4, stu04) ;
		list.add(5, stu04) ;
		list.add(6, null) ;
		
		System.out.println("遍历输出list集合中的所有元素");
		for (Student student : list) {
			System.out.println(student);
		}
		System.out.println();
		
		System.out.println("输出索引位置为2的元素：" + list.get(2));
		System.out.println();
		
		System.out.println("修改索引位置为0的元素：" + list.set(0, stu03));
		System.out.println();
		
		System.out.println("循环输出list集合中的所有元素");
		ListIterator<Student> listIterator = list.listIterator() ;
		while(listIterator.hasNext()) {
			Student student = listIterator.next() ;
			System.out.println(student);
		}
		System.out.println();
		
		System.out.println("删除索引位置为4的元素");
		list.remove(4) ;
		System.out.println();
		
		System.out.println("遍历输出list集合中的所有元素");
		for (Student student : list) {
			System.out.println(student);
		}
	}
	
	/**
	 * 测试List集合基本操作03
	 * 		利用Arrays工具类的asList()方法将数组转换成list集合
	 * 		注意：虽然可以把数组转换成集合，但是数组的长度不能改变
	 * 			对转换后的集合进行操作时，只要是涉及到改变原数组长度的操作，都将会报UnsupportedOperationException异常
	 */
	@Test
	public void testListHandle_03() {
		
		List<String> asList = Arrays.asList("001","002","003") ;
//		UnsupportedOperationException异常
//		asList.add("004") ;
//		UnsupportedOperationException异常
//		asList.remove("003") ;
		
		asList.set(1, "00-2") ;
		
		for (String element : asList) {
			System.out.println(element);
		}
		
		
	}
	
}
